import { Context, Next } from 'koa'
import * as jwt from 'jsonwebtoken'
import { WXAPPSECRET } from '@/config'

export const responseHandler = async (ctx: Context, next: Next) => {
    try {
        // 1. response 中间件先接到请求
        // 2. 通过 await next() 把"接力棒"传给下一个中间件
        // 3. 等所有中间件都跑完后
        // 4. 最后再统一处理响应格式
        await next()

        // 404 处理
        if (!ctx.body && ctx.status === 404) {
            ctx.status = 404
            ctx.body = {
                code: 404,
                message: `接口 ${ctx.path} 不存在`,
                data: null
            }
            return
        }

        // 统一响应格式
        if (ctx.body) {
            ctx.body = {
                ...ctx.body,
                code: 0,
                message: '成功'
            }
        }
    } catch (err) {
        // 异常处理
        ctx.status = err.status || 500
        ctx.body = {
            code: err.status || 500,
            message: err.message || '服务器逻辑异常',
            data: null
        }

        // 记录错误日志
        console.error(err)
    }
}

export async function loginStatusHandler(ctx: Context, next: Next) {
    await next()

    const token = ctx.headers.authorization?.split(' ')[1]

    if (ctx.state.isLogin) {
        ctx.body = Object.assign({}, ctx.body, { isLogin: true })
    } else if (token) {
        try {
            jwt.verify(token, WXAPPSECRET)
            ctx.body = Object.assign({}, ctx.body, { isLogin: true })
        } catch (error) {
            ctx.body = Object.assign({}, ctx.body, { isLogin: false })
        }
    } else {
        ctx.body = Object.assign({}, ctx.body, { isLogin: false })
    }
}
